/* ************************************************************************
#
# DivConq
#
# http://divconq.com/
#
# Copyright:
# Copyright 2014 eTimeline, LLC. All rights reserved.
#
# License:
# See the license.txt file in the project's top-level directory for details.
#
# Authors:
# * Andy White
#
************************************************************************ */
package divconq.web;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import divconq.filestore.CommonPath;
import divconq.log.Logger;
import divconq.util.StringUtil;
import divconq.www.http.ContentType;
import divconq.www.http.parse.ContentTypeParser;
import divconq.www.http.parse.DateParser;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.cookie.Cookie;
import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
import io.netty.handler.codec.http.DefaultHttpHeaders;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpHeaders.Names;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.QueryStringDecoder;
public class Request {
protected CommonPath path = null;
protected CommonPath orgpath = null;
protected String orgrequri = null;
protected HttpHeaders headers = null;
protected HttpMethod method = null;
protected Map<String, List<String>> parameters = null;
protected Map<String, Cookie> cookies = new HashMap<>();
protected ContentType contentType = null;
public Cookie getCookie(String name) {
return this.cookies.get(name);
}
public boolean hasHeader(String name) {
return this.headers.contains(name);
}
public String getHeader(String name) {
return this.headers.get(name);
}
public long getDateHeader(String name) {
String value = this.headers.get(name);
if (StringUtil.isEmpty(value))
return -1;
DateParser parser = new DateParser();
return parser.convert(value);
}
public CommonPath getOriginalPath() {
return this.orgpath;
}
public CommonPath getPath() {
return this.path;
}
public String getOriginalPathUri() {
return this.orgrequri;
}
// sometimes the path is rewritten by rules, this should reflect the current view of the path
// TODO maybe store the "original" path too?
public void setPath(CommonPath v) {
this.path = v;
}
public HttpMethod getMethod() {
return this.method;
}
public ContentType getContentType() {
return this.contentType;
}
public Map<String, List<String>> getParameters() {
return this.parameters;
}
public String getParameter(String name) {
if (this.parameters == null)
return null;
List<String> values = this.parameters.get(name);
if ((values == null) || (values.size() == 0))
return null;
return values.get(0);
}
public List<String> getParameters(String name) {
if (this.parameters == null)
return null;
return this.parameters.get(name);
}
public boolean pathEquals(String v) {
if (this.path != null)
return this.path.getFull().equals(v);
return false;
}
public boolean pathStartsWith(String v) {
if (this.path != null)
return this.path.getFull().startsWith(v);
return false;
}
public void load(ChannelHandlerContext ctx, HttpRequest req) {
this.method = req.getMethod();
this.headers = req.headers();
String value = req.headers().get(Names.COOKIE);
if (StringUtil.isNotEmpty(value)) {
Set<Cookie> cset = ServerCookieDecoder.STRICT.decode(value);
for (Cookie cookie : cset)
this.cookies.put(cookie.name(), cookie);
}
QueryStringDecoder decoderQuery = new QueryStringDecoder(req.getUri());
this.parameters = decoderQuery.parameters(); // TODO decode
this.path = new CommonPath(QueryStringDecoder.decodeComponent(decoderQuery.path()));
this.orgpath = this.path;
this.orgrequri = QueryStringDecoder.decodeComponent(decoderQuery.uri());
this.contentType = new ContentTypeParser(this.headers.get(Names.CONTENT_TYPE));
if (Logger.isDebug()) {
Logger.debug("Request Method " + this.method);
for (Entry<String, String> ent : this.headers.entries()) {
Logger.debug("Request header: " + ent.getKey() + ": " + ent.getValue());
}
}
}
public void loadVoid(CommonPath path) {
this.method = HttpMethod.GET;
this.headers = new DefaultHttpHeaders();
this.parameters = new HashMap<>();
this.path = path;
this.orgpath = this.path;
}
}